/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.capex.farmacus.controllers;

import edu.capex.farmacus.controllers.exceptions.NonexistentEntityException;
import edu.capex.farmacus.controllers.exceptions.PreexistingEntityException;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import edu.capex.farmacus.encapsulates.Vendedores;
import edu.capex.farmacus.encapsulates.Medicamentos;
import edu.capex.farmacus.encapsulates.Farmacias;
import edu.capex.farmacus.encapsulates.Vendedorfarmaciamedicamento;
import edu.capex.farmacus.encapsulates.VendedorfarmaciamedicamentoPK;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

/**
 *
 * @author IK
 */
public class VendedorfarmaciamedicamentoJpaController implements Serializable {

    public VendedorfarmaciamedicamentoJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Vendedorfarmaciamedicamento vendedorfarmaciamedicamento) throws PreexistingEntityException, Exception {
        if (vendedorfarmaciamedicamento.getVendedorfarmaciamedicamentoPK() == null) {
            vendedorfarmaciamedicamento.setVendedorfarmaciamedicamentoPK(new VendedorfarmaciamedicamentoPK());
        }
        vendedorfarmaciamedicamento.getVendedorfarmaciamedicamentoPK().setFarmacia(vendedorfarmaciamedicamento.getFarmacias().getId());
        vendedorfarmaciamedicamento.getVendedorfarmaciamedicamentoPK().setVendedor(vendedorfarmaciamedicamento.getVendedores().getId());
        vendedorfarmaciamedicamento.getVendedorfarmaciamedicamentoPK().setMedicamento(vendedorfarmaciamedicamento.getMedicamentos().getIdmedicamentos());
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Vendedores vendedores = vendedorfarmaciamedicamento.getVendedores();
            if (vendedores != null) {
                vendedores = em.getReference(vendedores.getClass(), vendedores.getId());
                vendedorfarmaciamedicamento.setVendedores(vendedores);
            }
            Medicamentos medicamentos = vendedorfarmaciamedicamento.getMedicamentos();
            if (medicamentos != null) {
                medicamentos = em.getReference(medicamentos.getClass(), medicamentos.getIdmedicamentos());
                vendedorfarmaciamedicamento.setMedicamentos(medicamentos);
            }
            Farmacias farmacias = vendedorfarmaciamedicamento.getFarmacias();
            if (farmacias != null) {
                farmacias = em.getReference(farmacias.getClass(), farmacias.getId());
                vendedorfarmaciamedicamento.setFarmacias(farmacias);
            }
            em.persist(vendedorfarmaciamedicamento);
            if (vendedores != null) {
                vendedores.getVendedorfarmaciamedicamentoList().add(vendedorfarmaciamedicamento);
                vendedores = em.merge(vendedores);
            }
            if (medicamentos != null) {
                medicamentos.getVendedorfarmaciamedicamentoList().add(vendedorfarmaciamedicamento);
                medicamentos = em.merge(medicamentos);
            }
            if (farmacias != null) {
                farmacias.getVendedorfarmaciamedicamentoList().add(vendedorfarmaciamedicamento);
                farmacias = em.merge(farmacias);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findVendedorfarmaciamedicamento(vendedorfarmaciamedicamento.getVendedorfarmaciamedicamentoPK()) != null) {
                throw new PreexistingEntityException("Vendedorfarmaciamedicamento " + vendedorfarmaciamedicamento + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Vendedorfarmaciamedicamento vendedorfarmaciamedicamento) throws NonexistentEntityException, Exception {
        vendedorfarmaciamedicamento.getVendedorfarmaciamedicamentoPK().setFarmacia(vendedorfarmaciamedicamento.getFarmacias().getId());
        vendedorfarmaciamedicamento.getVendedorfarmaciamedicamentoPK().setVendedor(vendedorfarmaciamedicamento.getVendedores().getId());
        vendedorfarmaciamedicamento.getVendedorfarmaciamedicamentoPK().setMedicamento(vendedorfarmaciamedicamento.getMedicamentos().getIdmedicamentos());
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Vendedorfarmaciamedicamento persistentVendedorfarmaciamedicamento = em.find(Vendedorfarmaciamedicamento.class, vendedorfarmaciamedicamento.getVendedorfarmaciamedicamentoPK());
            Vendedores vendedoresOld = persistentVendedorfarmaciamedicamento.getVendedores();
            Vendedores vendedoresNew = vendedorfarmaciamedicamento.getVendedores();
            Medicamentos medicamentosOld = persistentVendedorfarmaciamedicamento.getMedicamentos();
            Medicamentos medicamentosNew = vendedorfarmaciamedicamento.getMedicamentos();
            Farmacias farmaciasOld = persistentVendedorfarmaciamedicamento.getFarmacias();
            Farmacias farmaciasNew = vendedorfarmaciamedicamento.getFarmacias();
            if (vendedoresNew != null) {
                vendedoresNew = em.getReference(vendedoresNew.getClass(), vendedoresNew.getId());
                vendedorfarmaciamedicamento.setVendedores(vendedoresNew);
            }
            if (medicamentosNew != null) {
                medicamentosNew = em.getReference(medicamentosNew.getClass(), medicamentosNew.getIdmedicamentos());
                vendedorfarmaciamedicamento.setMedicamentos(medicamentosNew);
            }
            if (farmaciasNew != null) {
                farmaciasNew = em.getReference(farmaciasNew.getClass(), farmaciasNew.getId());
                vendedorfarmaciamedicamento.setFarmacias(farmaciasNew);
            }
            vendedorfarmaciamedicamento = em.merge(vendedorfarmaciamedicamento);
            if (vendedoresOld != null && !vendedoresOld.equals(vendedoresNew)) {
                vendedoresOld.getVendedorfarmaciamedicamentoList().remove(vendedorfarmaciamedicamento);
                vendedoresOld = em.merge(vendedoresOld);
            }
            if (vendedoresNew != null && !vendedoresNew.equals(vendedoresOld)) {
                vendedoresNew.getVendedorfarmaciamedicamentoList().add(vendedorfarmaciamedicamento);
                vendedoresNew = em.merge(vendedoresNew);
            }
            if (medicamentosOld != null && !medicamentosOld.equals(medicamentosNew)) {
                medicamentosOld.getVendedorfarmaciamedicamentoList().remove(vendedorfarmaciamedicamento);
                medicamentosOld = em.merge(medicamentosOld);
            }
            if (medicamentosNew != null && !medicamentosNew.equals(medicamentosOld)) {
                medicamentosNew.getVendedorfarmaciamedicamentoList().add(vendedorfarmaciamedicamento);
                medicamentosNew = em.merge(medicamentosNew);
            }
            if (farmaciasOld != null && !farmaciasOld.equals(farmaciasNew)) {
                farmaciasOld.getVendedorfarmaciamedicamentoList().remove(vendedorfarmaciamedicamento);
                farmaciasOld = em.merge(farmaciasOld);
            }
            if (farmaciasNew != null && !farmaciasNew.equals(farmaciasOld)) {
                farmaciasNew.getVendedorfarmaciamedicamentoList().add(vendedorfarmaciamedicamento);
                farmaciasNew = em.merge(farmaciasNew);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                VendedorfarmaciamedicamentoPK id = vendedorfarmaciamedicamento.getVendedorfarmaciamedicamentoPK();
                if (findVendedorfarmaciamedicamento(id) == null) {
                    throw new NonexistentEntityException("The vendedorfarmaciamedicamento with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(VendedorfarmaciamedicamentoPK id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Vendedorfarmaciamedicamento vendedorfarmaciamedicamento;
            try {
                vendedorfarmaciamedicamento = em.getReference(Vendedorfarmaciamedicamento.class, id);
                vendedorfarmaciamedicamento.getVendedorfarmaciamedicamentoPK();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The vendedorfarmaciamedicamento with id " + id + " no longer exists.", enfe);
            }
            Vendedores vendedores = vendedorfarmaciamedicamento.getVendedores();
            if (vendedores != null) {
                vendedores.getVendedorfarmaciamedicamentoList().remove(vendedorfarmaciamedicamento);
                vendedores = em.merge(vendedores);
            }
            Medicamentos medicamentos = vendedorfarmaciamedicamento.getMedicamentos();
            if (medicamentos != null) {
                medicamentos.getVendedorfarmaciamedicamentoList().remove(vendedorfarmaciamedicamento);
                medicamentos = em.merge(medicamentos);
            }
            Farmacias farmacias = vendedorfarmaciamedicamento.getFarmacias();
            if (farmacias != null) {
                farmacias.getVendedorfarmaciamedicamentoList().remove(vendedorfarmaciamedicamento);
                farmacias = em.merge(farmacias);
            }
            em.remove(vendedorfarmaciamedicamento);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Vendedorfarmaciamedicamento> findVendedorfarmaciamedicamentoEntities() {
        return findVendedorfarmaciamedicamentoEntities(true, -1, -1);
    }

    public List<Vendedorfarmaciamedicamento> findVendedorfarmaciamedicamentoEntities(int maxResults, int firstResult) {
        return findVendedorfarmaciamedicamentoEntities(false, maxResults, firstResult);
    }

    private List<Vendedorfarmaciamedicamento> findVendedorfarmaciamedicamentoEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Vendedorfarmaciamedicamento.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Vendedorfarmaciamedicamento findVendedorfarmaciamedicamento(VendedorfarmaciamedicamentoPK id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Vendedorfarmaciamedicamento.class, id);
        } finally {
            em.close();
        }
    }

    public int getVendedorfarmaciamedicamentoCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Vendedorfarmaciamedicamento> rt = cq.from(Vendedorfarmaciamedicamento.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
